home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1995 June / MacFormat 25.iso / Shareware City / Developers / ICAppSourceKit1.0 / ICPopupWhats.p < prev    next >
Encoding:
Text File  |  1994-10-30  |  7.4 KB  |  263 lines  |  [TEXT/PJMM]

  1. unit ICPopupWhats;
  2.  
  3. interface
  4.  
  5.     uses
  6.         ICWindowGlobals;
  7.  
  8.     function WhatOpenPopup (wt: WindowType; item: integer): OSErr;
  9.     function WhatFlushPopup (wt: WindowType; item: integer): OSErr;
  10.     function WhatClosePopup (wt: WindowType; item: integer): OSErr;
  11.     function WhatClickPopup (wt: WindowType; item: integer; er: eventRecord): OSErr;
  12.  
  13. implementation
  14.  
  15.     uses
  16.         ICStrH, 
  17.  
  18.         ICDialogs, ICMiscSubs, ICSubs, ICDocUtils;
  19.  
  20.     procedure InternalSetItem (mh: MenuHandle; item_num: integer; text: Str255);
  21.     begin
  22.         Delete(text, Pos(':', text), 255);
  23.         SetItem(mh, item_num, text);
  24.     end; (* InternalSetItem *)
  25.  
  26.     procedure SafeAppendMenu (mh: MenuHandle; text: str255);
  27.     begin
  28.         AppendMenu(mh, 'fred');
  29.         InternalSetItem(mh, CountMItems(mh), text);
  30.     end;
  31.  
  32.     procedure SafeInsertMenuItem (mh: MenuHandle; after: integer; text: str255);
  33.     begin
  34.         InsMenuItem(mh, 'fred', after);
  35.         InternalSetItem(mh, after, text);
  36.     end;
  37.  
  38.     procedure AdjustPopupMenu (dlg: DialogPtr; item: integer);
  39.         var
  40.             control: ControlHandle;
  41.             menuh: MenuHandle;
  42.             servers: handle;
  43.             server: str255;
  44.             servers_count, menu_count, i, found: integer;
  45.             longmenu: boolean;
  46.     begin
  47.         control := GetDControlHandle(dlg, item);
  48.         menuh := GetPopupMHandle(dlg, item);
  49.         servers := handle(control^^.contrlRfCon);
  50.         menu_count := CountMItems(menuh);
  51.         servers_count := CountStrsH(servers);
  52.  
  53.         if menu_count = 0 then begin
  54.             for i := 2 to servers_count do begin
  55.                 SafeAppendMenu(menuh, GetIndStrH(servers, i));
  56.             end;
  57.             AppendMenu(menuh, '(-');
  58.             AppendMenu(menuh, GetAString(128, 2));
  59.             menu_count := CountMItems(menuh);
  60.         end;
  61.         found := -1;
  62.         server := GetIndStrH(servers, 1);
  63.         for i := 2 to servers_count do begin
  64.             if server = GetIndStrH(servers, i) then begin
  65.                 found := i;
  66.                 leave;
  67.             end;
  68.         end;
  69.         longmenu := menu_count = servers_count + 3;
  70.         if found > 0 then begin
  71.             if longmenu then begin
  72.                 DelMenuItem(menuh, 1);
  73.                 DelMenuItem(menuh, 1);
  74.                 SetDCtlValue(dlg, item, GetDCtlValue(dlg, item) - 2);
  75.             end;
  76.             SetCtlMax(GetDControlHandle(dlg, item), CountMItems(menuh));
  77.             SetDCtlValue(dlg, item, found - 1);
  78.         end
  79.         else begin
  80.             if not longmenu then begin
  81.                 InsMenuItem(menuh, '(-;fred', 0);
  82.                 SetDCtlValue(dlg, item, GetDCtlValue(dlg, item) + 2);
  83.             end;
  84.             InternalSetItem(menuh, 1, GetIndStrH(servers, 1));
  85.             SetCtlMax(GetDControlHandle(dlg, item), CountMItems(menuh));
  86.             SetDCtlValue(dlg, item, 1);
  87.         end;
  88.         EnableItem(menuh, GetDCtlValue(dlg, item));
  89.     end;
  90.  
  91.     function UsingName (servers: Handle; name: Str255): boolean;
  92.         var
  93.             tmpstr: Str255;
  94.             i: integer;
  95.     begin
  96.         UsingName := false;
  97.         for i := 2 to CountStrsH(servers) do begin
  98.             tmpstr := GetIndStrH(servers, i);
  99.             Delete(tmpstr, Pos(':', tmpstr), 255);
  100.             if IUEqualString(tmpstr, name) = 0 then begin
  101.                 UsingName := true;
  102.                 leave;
  103.             end; (* if *)
  104.         end; (* for *)
  105.     end; (* UsingName *)
  106.  
  107.     var
  108.         ask_filter_globals: Handle;
  109.  
  110.     function AskServerFilter (dlog: DialogPtr; var event: EventRecord; var item: integer): boolean;
  111.         var
  112.             dim_ok: boolean;
  113.             name_string, host_string: Str255;
  114.     begin
  115.         GetItemText(dlog, 4, name_string);
  116.         GetItemText(dlog, 5, host_string);
  117.         dim_ok := (name_string = '') | (host_string = '') | UsingName(ask_filter_globals, name_string);
  118.         SetDCtlEnable(dlog, ok, not dim_ok);
  119.         OutlineDefault1(dlog, 3);
  120.         AskServerFilter := CancelModalFilter(dlog, event, item);
  121.     end; (* AskServerFilter *)
  122.  
  123.     function AskOtherServer (archie_popup: boolean; servers: Handle; var server: Str255): boolean;
  124.         var
  125.             modal: DialogPtr;
  126.             result: boolean;
  127.             item: integer;
  128.             tmpstr: Str255;
  129.     begin
  130.         result := false;
  131.         modal := GetNewDialog(400, nil, WindowPtr(-1));
  132.         if modal <> nil then begin
  133.             ParamText(GetAString(128, 3 + ord(archie_popup)), '', '', '');
  134.             SelIText(modal, 4, 0, 32767);
  135.             SetUpDefaultOutline(modal, ok, 3);
  136.             if archie_popup then begin
  137.                 HideDItem(modal, 6);
  138.                 HideDItem(modal, 10);
  139.             end; (* if *)
  140.             ShowWindow(modal);
  141.             InitCursor;
  142.             ask_filter_globals := servers;
  143.             repeat
  144.                 ModalDialog(@AskServerFilter, item);
  145.             until item in [ok, cancel];
  146.             result := (item = ok);
  147.             if result then begin
  148.                 GetItemText(modal, 4, server);
  149.                 GetItemText(modal, 5, tmpstr);
  150.                 server := concat(server, ':', tmpstr);
  151.                 GetItemText(modal, 6, tmpstr);
  152.                 server := concat(server, ':', tmpstr);
  153.             end; (* if *)
  154.             DisposeWindow(modal);
  155.         end; (* if *)
  156.         AskOtherServer := result;
  157.     end; (* AskOtherServer *)
  158.  
  159.     const
  160.         pf_archie = 0;
  161.         pf_archie_mask = $0001;
  162.  
  163.     function WhatClickPopup (wt: WindowType; item: integer; er: eventRecord): OSErr;
  164.         var
  165.             dlg: WindowPtr;
  166.             value: integer;
  167.             control: ControlHandle;
  168.             menuh: MenuHandle;
  169.             servers: handle;
  170.             server: str255;
  171.             servers_count, menu_count, i, found: integer;
  172.             longmenu: boolean;
  173.             archie_popup: boolean;
  174.     begin
  175.         dlg := windowinfo[wt].window;
  176.         control := GetDControlHandle(dlg, item);
  177.         menuh := GetPopupMHandle(dlg, item);
  178.         servers := handle(control^^.contrlRfCon);
  179.         menu_count := CountMItems(menuh);
  180.         servers_count := CountStrsH(servers);
  181.         longmenu := (menu_count = servers_count + 3);
  182.  
  183.         value := GetDCtlValue(dlg, item);
  184.         if value = menu_count then begin
  185.             archie_popup := btst(windowinfo[wt].items[item]^.flags, pf_archie);
  186.             if AskOtherServer(archie_popup, servers, server) then begin
  187.                 SetIndStrH(servers, 1, server);
  188.             end; (* if *)
  189.             AdjustPopupMenu(dlg, item);
  190.         end
  191.         else begin
  192.             value := value - 2 * ord(longmenu);
  193.             if value > 0 then begin
  194.                 server := GetIndStrH(servers, value + 1);
  195.                 SetIndStrH(servers, 1, server);
  196.                 AdjustPopupMenu(dlg, item);
  197.             end;
  198.         end;
  199.         WhatClickPopup := noErr;
  200.     end; (* WhatClickPopup *)
  201.  
  202.     function WhatOpenPopup (wt: WindowType; item: integer): OSErr;
  203.         var
  204.             dlg: WindowPtr;
  205.             server: str255;
  206.             servers: handle;
  207.             keybase: Str255;
  208.             attr: longint;
  209.             err: OSErr;
  210.     begin
  211.         err := noErr;
  212.         keybase := windowinfo[wt].items[item]^.key;
  213.         servers := nil;
  214.         if ICGetPrefHandle(GetInstance, concat(keybase, 'All'), attr, servers) <> noErr then begin
  215.             servers := NewStrH;
  216.             if servers = nil then begin
  217.                 err := memFullErr;
  218.             end; (* if *)
  219.         end; (* if *)
  220.         if ICGetPrefStr(GetInstance, concat(keybase, 'Preferred'), attr, server) <> noErr then begin
  221.             server := GetIndStrH(servers, 1);
  222.         end; (* if *)
  223.         ProcessAttributes(wt, item, attr);
  224.         dlg := windowinfo[wt].window;
  225.         GetDControlHandle(dlg, item)^^.contrlRfCon := longint(servers);
  226.         InsIndStrH(servers, 1, server);
  227.         AdjustPopupMenu(dlg, item);
  228.         SetDCtlEnable(dlg, item, not IsLocked(wt, item));
  229.         WhatOpenPopup := err;
  230.     end; (* WhatOpenPopup *)
  231.  
  232.     function WhatFlushPopup (wt: WindowType; item: integer): OSErr;
  233.         var
  234.             dlg: WindowPtr;
  235.             server: Str255;
  236.             old_server: Str255;
  237.             keybase: Str255;
  238.             err: OSErr;
  239.             attr: longint;
  240.     begin
  241.         dlg := windowinfo[wt].window;
  242.         server := GetIndStrH(Handle(GetDControlHandle(dlg, item)^^.contrlRfCon), 1);
  243.         keybase := windowinfo[wt].items[item]^.key;
  244.         if ICMapErr(ICGetPrefStr(GetInstance, concat(keybase, 'Preferred'), attr, old_server)) <> noErr then begin
  245.             old_server := '::';
  246.         end; (* if *)
  247.         err := noErr;
  248.         if server <> old_server then begin
  249.             err := ICMapErr(ICSetPrefStr(GetInstance, concat(keybase, 'Preferred'), ICattr_no_change, server));
  250.             if err = noErr then begin
  251.                 DirtyDocument;
  252.             end; (* if *)
  253.         end; (* if *)
  254.         WhatFlushPopup := err;
  255.     end; (* WhatFlushPopup *)
  256.  
  257.     function WhatClosePopup (wt: WindowType; item: integer): OSErr;
  258.     begin
  259.         DisposeHandle(Handle(GetDControlHandle(windowinfo[wt].window, item)^^.contrlRfCon));
  260.         WhatClosePopup := noErr;
  261.     end; (* WhatClosePopup *)
  262.  
  263. end. (* ICPopupWhats *)